// 定义函数可以有参数也可以有多个参数，可以有返回值也可以没有返回值
function a(){
  console.log(1);
}

// 定义一个无参数无返回值的函数
// : void 表示该函数没有返回值
// : 冒号后面的是返回值类型
function fn1(): void{
  console.log(1);

}

// 定义一个无参数有一个字符串类型的返回值
function fn2(): string{
  console.log(1);

  return '键盘请安静'
}

// 定义返回值是一个对象的函数
function fn3(): {name: string;age: number}{

  return {
    name: '张一',
    age: 20
  }
}

interface iObj {
  name: string;
  age: number
}

function fn4(): iObj{
  return {
    name: '张一',
    age: 20
  }
}

// 定义一个 type
type tDir = '东' | '南' | '西' | '北'

function fn5(): tDir{
  return '北'
}

// 返回一个数组
function fn6(): number[]{

  return [1,2,3,4,5]
}

function fn7(): Array<number>{

  return [1,2,3,4,5]
}


// ----------------- 带参数的函数 ------------------------
function fn8(a: any,b: number): void{
  console.log(a,b);

}

// b?: number 数组为可选参数
function fn9(a: any,b?: number): void{
  console.log(a,b);
}

// b: number = 10 带有默认值的函数
function fn10(a: any,b: number = 10): number{
  console.log(a,b);
  return a + b
}
// fn11: () => void  fn11 类型是一个函数类型，而且该函数是没有参数和返回值的
const fn11: () => void = function() : void { }

// 定义一个无参数有返回值的函数
const fn12: () => number = function(): number {
  return 1
}


const fn13 : (a: number) => number = function (a: number): number {
  return 1
}

const fn14: (a: number) => {name: string} = function(a: number): {name: string}{
  return {
    name: '高举'
  }
}

const fn15: (a: number) => iObj = function(a: number): iObj{
  return {
    name: '高举',
    age: 1
  }
}


const fn16: (a: iObj) => iObj = function(a: iObj): iObj{
  return {
    name: '高举',
    age: 1
  }
}
